<?php

namespace Nece\Sdk\Coze\Api;

use Nece\Sdk\Coze\ApiAbstract;

/**
 * 知识库
 *
 * @author gjw
 * @created 2025-04-23 15:03:20
 */
class Datasets extends ApiAbstract
{
    /**
     * 创建知识库
     *
     * @author gjw
     * @created 2025-04-23 12:10:00
     *
     * @param string $name 知识库名称，长度不超过 100 个字符。
     * @param string $space_id 知识库所在的空间的 Space ID。Space ID 是空间的唯一标识。
     * @param int $format_type 知识库类型。取值包括：0：文本类型2：图片类型
     * @param string $description 知识库描述信息。
     * @param array $file_id 知识库图标，应传入上传文件接口中获取的 file_id。
     * @return array
     */
    public function create(string $name, string $space_id, int $format_type, string $description = '', string $file_id = '')
    {
        $api = '/v1/dataset';
        $params = array(
            'name' => $name,
            'space_id' => $space_id,
            'format_type' => $format_type,
        );

        if (!empty($description)) {
            $params['description'] = $description;
        }

        if (!empty($file_id)) {
            $params['file_id'] = $file_id;
        }

        return $this->post($api, $params);
    }

    /**
     * 查看知识库列表
     *
     * @author gjw
     * @created 2025-04-23 15:03:55
     *
     * @param string $space_id 知识库所在的空间的 Space ID。Space ID 是空间的唯一标识。
     * @param string $name 知识库名称，支持模糊搜索。
     * @param integer $format_type 知识库类型。取值包括：0：文本类型 1：表格类型2：图片类型
     * @param integer $page_num 查询结果分页展示时，此参数用于设置查看的页码。最小值为 1，默认为 1。
     * @param integer $page_size 查询结果分页展示时，此参数用于设置每页返回的数据量。取值范围为 1~300，默认为 10。
     * @return array
     */
    public function list(string $space_id, string $name = '', int $format_type = -1, int $page_num = 1, int $page_size = 10)
    {
        $api = '/v1/datasets';
        $query = array(
            'space_id' => $space_id,
            'page_num' => $page_num,
            'page_size' => $page_size
        );

        if ($name) {
            $query['name'] = $name;
        }

        if ($format_type > -1) {
            $query['format_type'] = $format_type;
        }

        return $this->get($api, $query);
    }

    /**
     * 修改知识库信息
     *
     * @author gjw
     * @created 2025-04-23 14:30:17
     *
     * @param string $dataset_id 知识库 ID。
     * @param string $name 知识库名称，长度不超过 100 个字符。
     * @param string $description 知识库描述信息。
     * @param string $file_id 知识库图标，应传入上传文件接口中获取的 file_id。
     * @return array
     */
    public function modify(string $dataset_id, string $name, string $description, string $file_id)
    {
        $api = str_replace(':dataset_id', $dataset_id, '/v1/datasets/:dataset_id');
        $params = array(
            'name' => $name
        );
        if ($description) {
            $params['description'] = $description;
        }
        if ($file_id) {
            $params['file_id'] = $file_id;
        }

        return $this->post($api, $params, [], 'PUT');
    }

    /**
     * 删除知识库
     *
     * @author gjw
     * @created 2025-04-23 14:37:45
     *
     * @param string $dataset_id 知识库 ID。
     * @return array
     */
    public function delete(string $dataset_id)
    {
        $api = str_replace(':dataset_id', $dataset_id, '/v1/datasets/:dataset_id');
        return $this->get($api, [], 'DELETE');
    }

    /**
     * 创建知识库文件
     *
     * @author gjw
     * @created 2025-04-23 14:40:54
     *
     * @param string $dataset_id 知识库 ID。
     * @param array $document_bases 待上传文件的元数据信息。数组最大长度为 10，即每次最多上传 10 个文件。
     * @param array $chunk_strategy 分段规则 https://www.coze.cn/docs/developer_guides/create_knowledge_files#fb4d001d
     * @param integer $format_type 知识库类型。取值包括：0：文本类型2：图片类型
     * @return array
     */
    public function documentCreate(string $dataset_id, array $document_bases, array $chunk_strategy, int $format_type)
    {
        $api = '/open_api/knowledge/document/create';
        $params = array(
            'dataset_id' => $dataset_id,
            'document_bases' => $document_bases,
            'chunk_strategy' => $chunk_strategy,
            'format_type' => $format_type,
        );

        $this->addHttpHeader('Agw-Js-Conv', 'str');
        return $this->post($api, $params);
    }

    /**
     * 修改知识库文件
     *
     * @author gjw
     * @created 2025-04-23 14:47:51
     *
     * @param integer $document_id 待修改的知识库文件 ID。
     * @param string $document_name 知识库文件的新名称。
     * @param array $update_rule 在线网页的更新配置。
     * @return array
     */
    public function documentUpdate(int $document_id = 0, string $document_name = '', array $update_rule = [])
    {
        $api = '/open_api/knowledge/document/update';
        $params = array();
        if ($document_id) {
            $params['document_id'] = $document_id;
        }
        if ($document_name) {
            $params['document_name'] = $document_name;
        }
        if ($update_rule) {
            $params['update_rule'] = $update_rule;
        }

        $this->addHttpHeader('Agw-Js-Conv', 'str');
        return $this->post($api, $params);
    }

    /**
     * 查看知识库文件列表
     *
     * @author gjw
     * @created 2025-04-23 14:49:34
     *
     * @param integer $dataset_id 知识库 ID。
     * @param integer $page 分页查询时的页码。默认为 1，即从第一页数据开始返回
     * @param integer $size 分页大小。默认为 10，即每页返回 10 条数据
     * @return array
     */
    public function documentList(int $dataset_id, int $page = 1, $size = 10)
    {
        $api = '/knowledge/document/list';
        $params = array(
            'dataset_id' => $dataset_id,
            'page' => $page,
            'size' => $size,
        );

        $this->addHttpHeader('Agw-Js-Conv', 'str');
        return $this->post($api, $params);
    }

    /**
     * 查看知识库文件上传进度
     *
     * @author gjw
     * @created 2025-04-23 14:53:56
     *
     * @param string $dataset_id 知识库 ID
     * @param array $document_ids 需要获取上传进度的文件 ID 列表。
     * @return array
     */
    public function progress(string $dataset_id, array $document_ids)
    {
        $api = '/v1/datasets/:dataset_id/process';
        $params = array(
            'dataset_id' => $dataset_id,
            'document_ids' => $document_ids,
        );

        return $this->post($api, $params);
    }

    /**
     * 更新知识库图片描述
     *
     * @author gjw
     * @created 2025-04-23 14:56:37
     *
     * @param string $dataset_id 知识库 ID
     * @param string $document_id 待更新描述的图片 ID。
     * @param string $caption 图片的描述信息。
     * @return array
     */
    public function updateImageCaption(string $dataset_id, string $document_id, string $caption)
    {
        $api = str_replace(array(':dataset_id', ':document_id'), array($dataset_id, $document_id), '/v1/datasets/:dataset_id/images/:document_id');
        $params = array(
            'caption' => $caption
        );

        return $this->post($api, $params, [], 'PUT');
    }

    /**
     * 查看知识库图片列表
     *
     * @author gjw
     * @created 2025-04-23 15:00:49
     *
     * @param string $dataset_id 知识库 ID
     * @param integer $page_num 查询结果分页展示时，此参数用于设置查看的页码。最小值为 1，默认为 1。
     * @param integer $page_size 查询结果分页展示时，此参数用于设置每页返回的数据量。取值范围为 1~299，默认为 10。
     * @param string $keyword 对图片描述进行搜索时，搜索的关键字。
     * @param integer $has_caption 图片是否已设置了描述信息。1=true,0=false,-1=不限
     * @return array
     */
    public function imageList(string $dataset_id, int $page_num = 1, int $page_size = 10, string $keyword = '', int $has_caption = -1)
    {
        $api = '/v1/datasets/:dataset_id/images';
        $query = array(
            'dataset_id' => $dataset_id,
            'page_num' => $page_num,
            'page_size' => $page_size,
        );

        if ($keyword) {
            $query['keyword'] = $keyword;
        }

        if ($has_caption > -1) {
            $query['has_caption'] = boolval($has_caption);
        }

        return $this->get($api, $query);
    }

    /**
     * 删除知识库文件
     *
     * @author gjw
     * @created 2025-04-23 15:02:41
     *
     * @param array $document_ids
     * @return array
     */
    public function documentDelete(array $document_ids)
    {
        $api = '/open_api/knowledge/document/delete';
        $params = array(
            'document_ids' => $document_ids
        );

        return $this->post($api, $params);
    }
}
